/**
 * 计算文件内容md5值
 * @param file string 文件路径 或 文件描述符
 * @param opt json|null 选项
 * 		l16: boolean 是否返回16位长度  默认false:长=32
 * 		up: up boolean 是否转大写  默认false:小写
 * 		len: int|null 分块读大小(B)  默认见:$.fsPart()
 * 		ign: boolean 不存在是否忽略异常  默认false:抛出
 * 		syn: boolean 是否同步操作  默认false:异步
 * @return Promise|string  !opt.syn->Promise
 * 		string: 不存在且ign->'', 空文件->仍有值
 */
$.fsMd5 = function(file, opt=null){
	const $M=require('node:crypto'), R=(v,m,opt)=>{
		if(!v) return '';  m=m.digest('hex');
		if(opt.l16) m = m.slice(8,16);
		return opt.up ? m.toUpperCase() : m;
	};
	$.fsMd5 = function(file, opt=null){
		opt=$.mix({},opt); const m=$M.createHash('md5');
		const v = $.fsPart(file, x=>m.update(x), opt);
		return opt.syn?R(v,m,opt):v.then(x=>R(x,m,opt));
	};
	return $.fsMd5(file, opt);
};
